<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>10段代码打通js任督二脉</title>
</head>
<body>
<script type="text/javascript">
    /********************第1段 简单回调******************************/
  /*  function foo(){
        console.log(this.a);
    }
    function doFoo(fn){
        fn();
    }
    function doFoo2(o){
        o.foo();
    }
    var obj = {
        a: 2,
        foo: foo
    };
    var a = "I'm an a";
    doFoo(obj.foo);
    doFoo2(obj);*/

    function foo(){
        console.log(this.a)
    }
    function doFoo(fn){
        fn();
    }
    function doFoo2(o){
        o.foo();
    }
    var obj = {
        a: 2,
        foo: foo
    };
    var a = "I'm an a";
    //    在Javascript中，this指向函数 执行时的当前对象，而非声明环境有。

    //    执行doFoo的时候执行环境就是doFoo函数，执行环境为全局。
    doFoo(obj.foo);
    //    执行doFoo2时是在对象内部调用函数，this指针指向该对象。
    doFoo2(obj);
    /********************第2段 用apply改变函数作用域******************************/
    function foo2(somthing){
        console.log(this.a, somthing);
    }
    function bind(fn, obj){
        return function(){
            return fn.apply(obj, arguments);
        }
    }
    var obj2 = {
        a:2
    };
    var bar = bind(foo2, obj2);
    var b = bar(3);
    console.log(b);
    /********************第3段 new关键字******************************/
    function foo3(a,b){
        this.val = a+b;
    }
    var bar = foo3.bind(null, 'p1');
    var baz = new bar('p2');
    console.log(baz.val);
    /********************第4段 自执行函数******************************/
    function foo(){
        console.log(this.a);
    }
    var a = 2;
    var o = {a:3,foo:foo};
    var p = {a:4};
    (p.foo=o.foo)();
    /********************第5段 变量属性******************************/
    var a = [];
    a[0] = 1;
    a['foobar'] = 2;
    console.log(a.length);
    console.log(a.foobar);
   /********************第5段 精度问题******************************/

    var a = 'foo';
    a[1] = 'O';
    console.log(0.1+0.2==0.3||a);
    /********************第6段 命名提升******************************/
    foo6();
    var foo6 = 0;
    function foo6(){
        console.log(1);
    }
    foo6 = function(){
        console.log(2);
    };

    /********************第6段 命名提升******************************/
    foo7();
    var foo7 = 0;
    function foo7(){
        console.log(1);
    }
//    foo7();
    foo7 = function(){
        console.log(2);
    };
    foo7();
    /********************第8段 伪闭包******************************/
    function foo8(){
        console.log(a8);
    }
    function bar8 () {
        var a8 = 3;
        foo8();
    }
    var a8 = 2;
    bar8();

    function bar9 () {
        function foo9(){
            console.log(a9);
        }
        var a9 = 3;
        foo9();
    }
    var a9 = 2;
    bar9();
</script>


</body>
</html>